package gfiber

import (
	"fmt"
	"log"
	"strconv"

	"github.com/gofiber/fiber/v2"
)

type Person struct {
	Name     string   `json:"name" xml:"name" form:"name" query:"name"`
	Pass     string   `json:"pass" xml:"pass" form:"pass" query:"name"`
	Products []string `json:"products" query:"products"`
}

// application-json格式请求数据
func BodyParserTest(app *fiber.App) {
	app.Post("/user/create", func(c *fiber.Ctx) error {
		p := new(Person)
		if err := c.BodyParser(p); err != nil {
			return err
		}

		log.Println(p.Name) // john
		log.Println(p.Pass) // doe

		data := Person{
			Name: "Grame",
			Pass: "20",
		}
		return c.JSON(data)
		// return c.JSON(fiber.Map{"name": "Grame","age": 20,})
	})

	app.Get("/header", func(c *fiber.Ctx) error {
		fmt.Printf("IP: %v\n", c.IP())                                          // 获取IP
		fmt.Printf("GetRespHeader: %v\n", c.GetRespHeader("X-Request-Id"))      // "8d7ad5e3-aaf3-450b-a241-2beb887efd54"
		fmt.Printf("GetRespHeader: %v\n", c.GetRespHeader("Content-Type"))      // "text/plain"
		fmt.Printf("GetRespHeader: %v\n", c.GetRespHeader("something", "john")) // "john"
		fmt.Printf("Method: %v\n", c.Method())                                  // 获取请求方式
		fmt.Printf("OriginalURL: %v\n", c.OriginalURL())                        // 获取原始请求URL,参数中带?后的参数
		fmt.Printf("Path: %v\n", c.Path())                                      // 获取请求url，不带?后的参数信息
		fmt.Printf("Request: %v\n", c.Request())                                // 获取Request, *fasthttp.Request
		fmt.Printf("Response: %v\n", c.Response())                              // 获取Response, *fasthttp.Response
		// ..

		return c.Status(fiber.StatusOK).SendString("welcome, admin")
	})

	// url with parameters
	app.Get("/user/:id", func(c *fiber.Ctx) error {
		// 方式1
		c.Params("id") // 获取请求url中pathvariable参数

		// 方式2
		param := struct {
			ID uint `params:"id"`
		}{}
		c.ParamsParser(&param) // "{"id": 111}", 将pathvariable参数解析到 param中
		fmt.Printf("param: %v\n", param)

		id, _ := c.ParamsInt("id") // 将参数转为int
		// strconv.Itoa(id) // 将 int 转 string
		return c.SendString(strconv.Itoa(id))
	})

	// url中请求参数
	app.Get("/update", func(c *fiber.Ctx) error {
		// GET http://example.com/update?name=john&pass=doe&products=shoe

		// 方式1
		fmt.Printf("pass: %v\n", c.Query("pass"))         // 获取请求参数值
		fmt.Printf("name: %v\n", c.Query("name", "nike")) // "nike"
		fmt.Printf("products: %v\n", c.Query("products"))
		// 方式2： 将参数解析成 Person对象
		p := new(Person)
		if err := c.QueryParser(p); err != nil {
			return err
		}
		fmt.Printf("p: %v\n", p)
		return c.JSON(p)
	})
}
